home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / UNIXLIB37B / src / sys / s / _syslib < prev    next >
Text File  |  1992-02-17  |  10KB  |  582 lines

  1. ;    /* _syslib.s (c) Copyright 1990 H.Rogers */
  2.  
  3. a1 RN 0
  4. a2 RN 1
  5. a3 RN 2
  6. a4 RN 3
  7. v1 RN 4
  8. v2 RN 5
  9. v3 RN 6
  10. v4 RN 7
  11. v5 RN 8
  12. v6 RN 9
  13. sl RN 10
  14. fp RN 11
  15. ip RN 12
  16. sp RN 13
  17. lr RN 14
  18. pc RN 15
  19.  
  20. f0 FN 0
  21. f1 FN 1
  22. f2 FN 2
  23. f3 FN 3
  24. f4 FN 4
  25. f5 FN 5
  26. f6 FN 6
  27. f7 FN 7
  28.  
  29.     AREA    |C$$code|,CODE,READONLY
  30.  
  31.     IMPORT    |Image$$RO$$Base|
  32.     IMPORT    |Image$$RW$$Limit|
  33.  
  34.     EXPORT    |__svccli|    ; copy CLI in SVC mode
  35. |__svccli|
  36.     LDR    a2,[pc,#|__cli_ptr|-.-8]
  37.     LDR    a2,[a2,#0]
  38.     MOV    a4,lr
  39.     SWI    &16        ; OS_EnterOS
  40. |__svccli_l0|
  41.     LDRBT    a3,[a2],#1
  42.     STRBT    a3,[a1],#1
  43.     CMP    a3,#0
  44.     BNE    |__svccli_l0|
  45.     MOVS    pc,a4        ; return to USR mode
  46.  
  47. |__cli_ptr|
  48.     DCD    |__cli|
  49.  
  50. |__robase_ptr|
  51.     DCD    |__robase|
  52. |__base_ptr|
  53.     DCD    |__base|
  54. |__rwlimit_ptr|
  55.     DCD    |__rwlimit|
  56. |__himem_ptr|
  57.     DCD    |__himem|
  58. |__lomem_ptr|
  59.     DCD    |__lomem|
  60.  
  61. |__break_ptr|
  62.     DCD    |__break|
  63. |__stack_ptr|
  64.     DCD    |__stack|
  65.  
  66. |__time_ptr|
  67.     DCD    |__time|
  68.  
  69.     IMPORT    |__alloca_list|,WEAK
  70. |__alloca_list_ptr|
  71.     DCD    |__alloca_list|
  72.  
  73.     ENTRY
  74.  
  75.     IMPORT    |_main|
  76.     EXPORT    |__main|
  77. |__main|
  78.     SWI    &20010            ; OS_GetEnv
  79.     MOV    sp,a2
  80.     SUB    sl,sp,#2048
  81.  
  82.     LDR    a4,[pc,#|__cli_ptr|-.-8]
  83.     STR    a1,[a4,#0]
  84.     LDR    a4,[pc,#|__himem_ptr|-.-8]
  85.     STR    a2,[a4,#0]
  86.     LDR    a4,[pc,#|__stack_ptr|-.-8]
  87.     STR    sl,[a4,#0]
  88.     LDMIA    a3,{a1,a2}
  89.     AND    a2,a2,#&ff
  90.     LDR    a3,[pc,#|__time_ptr|-.-8]
  91.     STMIA    a3,{a1,a2}
  92.     LDR    a4,[pc,#|__robase_ptr|-.-8]
  93.     LDR    a1,[a4,#0]
  94.     LDR    a4,[pc,#|__base_ptr|-.-8]
  95.     STR    a1,[a4,#0]
  96.     LDR    a4,[pc,#|__rwlimit_ptr|-.-8]
  97.     LDR    a1,[a4,#0]
  98.     LDR    a4,[pc,#|__lomem_ptr|-.-8]
  99.     STR    a1,[a4,#0]
  100.     LDR    a4,[pc,#|__break_ptr|-.-8]
  101.     STR    a1,[a4,#0]
  102.  
  103.     CMP    sl,a1
  104.     MOVLSS    pc,lr            ; no stack - exit fast
  105.     ADD    sl,sl,#256
  106.     MOV    fp,#0
  107.     LDR    a1,[pc,#|__alloca_list_ptr|-.-8]
  108.     CMP    a1,#0
  109.     STRNE    fp,[a1,#0]
  110.     B    |_main|
  111.  
  112.  
  113.     EXPORT    |__exit|
  114. |__exit|
  115.     MOV    a3,a1
  116.     LDR    a2,[pc,#|__exit_word|-.-8]
  117.     MOV    a1,#0
  118.  
  119.     SWI    &11            ; OS_Exit - never returns
  120.  
  121. |__exit_word|
  122.     DCD    &58454241
  123.  
  124.  
  125.     IMPORT    |__vret|,WEAK
  126.     EXPORT    |___vret|
  127. |___vret|
  128.     DCD    |__vret|
  129.  
  130.     IMPORT    |__stdioinit|,WEAK
  131.     EXPORT    |___stdioinit|
  132. |___stdioinit|
  133.     DCD    |__stdioinit|
  134.  
  135.     IMPORT    |__stdioexit|,WEAK
  136.     EXPORT    |___stdioexit|
  137. |___stdioexit|
  138.     DCD    |__stdioexit|
  139.  
  140.  
  141.     EXPORT    |__rdenv|
  142. |__rdenv|
  143.     MOV    ip,a2
  144.     MOV    a2,#0
  145.     MOV    a3,#0
  146.     MOV    a4,#0
  147.  
  148.     SWI    &20040
  149.  
  150.     STMVCIA ip,{a2,a3,a4}
  151.     MOVVC    a1,#0
  152.  
  153.     MOVS    pc,lr
  154.  
  155.     EXPORT    |__wrenv|
  156. |__wrenv|
  157.     LDMIA    a2,{a2,a3,a4}
  158.  
  159.     SWI    &20040
  160.  
  161.     MOVVC    a1,#0
  162.  
  163.     MOVS    pc,lr
  164.  
  165.  
  166.     EXPORT    |x$divtest|
  167. |x$divtest|
  168.     MOVS    pc,lr
  169.  
  170.     EXPORT    |x$remainder|
  171. |x$remainder|
  172.     STMFD    sp!,{lr}
  173.     BL    |x$divide|
  174.     MOV    a1,a2
  175.     LDMFD    sp!,{pc}^
  176.  
  177.     EXPORT    |x$uremainder|
  178. |x$uremainder|
  179.     STMFD    sp!,{lr}
  180.     BL    |x$udivide|
  181.     MOV    a1,a2
  182.     LDMFD    sp!,{pc}^
  183.  
  184. |x$overflow|
  185.     MVN    a1,#0
  186.     MOVS    pc,lr
  187.  
  188.     EXPORT    |x$udivide|    ; a1 = a2 / a1; a2 = a2 % a1
  189. |x$udivide|
  190.     CMP    a1,#1
  191.     BLO    |x$overflow|
  192.     BEQ    |x$divide_l0|
  193.     MOV    ip,#0
  194.     MOVS    a2,a2
  195.     BPL    |x$divide_l1|
  196.     ORR    ip,ip,#&20000000; ip bit &20000000 = -ve a2
  197.     MOVS    a2,a2,LSR #1
  198.     ORRCS    ip,ip,#&10000000; ip bit &10000000 = bit 0 of a2
  199.     B    |x$divide_l1|
  200.  
  201. |x$divide_l0|            ; a1 == 1
  202.     MOV    a1,a2
  203.     MOV    a2,#0
  204.     MOVS    pc,lr
  205.  
  206.     EXPORT    |x$divide|    ; a1 = a2 / a1; a2 = a2 % a1
  207. |x$divide|
  208.     CMP    a1,#1
  209.     BLO    |x$overflow|
  210.     BEQ    |x$divide_l0|
  211.     ANDS    ip,a1,#&80000000
  212.     RSBMI    a1,a1,#0
  213.     ANDS    a3,a2,#&80000000
  214.     EOR    ip,ip,a3
  215.     RSBMI    a2,a2,#0
  216.     ORR    ip,a3,ip,LSR #1 ; ip bit &40000000 = -ve division
  217.                 ; ip bit &80000000 = -ve remainder
  218.  
  219. |x$divide_l1|
  220.     MOV    a3,#1
  221.     MOV    a4,#0
  222.  
  223.     CMP    a2,a1
  224.     BLO    |x$divide_b0|
  225.     CMP    a2,a1,LSL #1
  226.     BLO    |x$divide_b1|
  227.     CMP    a2,a1,LSL #2
  228.     BLO    |x$divide_b2|
  229.     CMP    a2,a1,LSL #3
  230.     BLO    |x$divide_b3|
  231.     CMP    a2,a1,LSL #4
  232.     BLO    |x$divide_b4|
  233.     CMP    a2,a1,LSL #5
  234.     BLO    |x$divide_b5|
  235.     CMP    a2,a1,LSL #6
  236.     BLO    |x$divide_b6|
  237.     CMP    a2,a1,LSL #7
  238.     BLO    |x$divide_b7|
  239.     CMP    a2,a1,LSL #8
  240.     BLO    |x$divide_b8|
  241.     CMP    a2,a1,LSL #9
  242.     BLO    |x$divide_b9|
  243.     CMP    a2,a1,LSL #10
  244.     BLO    |x$divide_b10|
  245.     CMP    a2,a1,LSL #11
  246.     BLO    |x$divide_b11|
  247.     CMP    a2,a1,LSL #12
  248.     BLO    |x$divide_b12|
  249.     CMP    a2,a1,LSL #13
  250.     BLO    |x$divide_b13|
  251.     CMP    a2,a1,LSL #14
  252.     BLO    |x$divide_b14|
  253.     CMP    a2,a1,LSL #15
  254.     BLO    |x$divide_b15|
  255.     CMP    a2,a1,LSL #16
  256.     BLO    |x$divide_b16|
  257.     CMP    a2,a1,LSL #17
  258.     BLO    |x$divide_b17|
  259.     CMP    a2,a1,LSL #18
  260.     BLO    |x$divide_b18|
  261.     CMP    a2,a1,LSL #19
  262.     BLO    |x$divide_b19|
  263.     CMP    a2,a1,LSL #20
  264.     BLO    |x$divide_b20|
  265.     CMP    a2,a1,LSL #21
  266.     BLO    |x$divide_b21|
  267.     CMP    a2,a1,LSL #22
  268.     BLO    |x$divide_b22|
  269.     CMP    a2,a1,LSL #23
  270.     BLO    |x$divide_b23|
  271.     CMP    a2,a1,LSL #24
  272.     BLO    |x$divide_b24|
  273.     CMP    a2,a1,LSL #25
  274.     BLO    |x$divide_b25|
  275.     CMP    a2,a1,LSL #26
  276.     BLO    |x$divide_b26|
  277.     CMP    a2,a1,LSL #27
  278.     BLO    |x$divide_b27|
  279.     CMP    a2,a1,LSL #28
  280.     BLO    |x$divide_b28|
  281.     CMP    a2,a1,LSL #29
  282.     BLO    |x$divide_b29|
  283.     CMP    a2,a1,LSL #30
  284.     BLO    |x$divide_b30|
  285.     CMP    a2,a1,LSL #31
  286.     SUBHS    a2,a2,a1,LSL #31
  287.     ADDHS    a4,a4,a3,LSL #31
  288.     CMP    a2,a1,LSL #30
  289.     SUBHS    a2,a2,a1,LSL #30
  290.     ADDHS    a4,a4,a3,LSL #30
  291. |x$divide_b30|
  292.     CMP    a2,a1,LSL #29
  293.     SUBHS    a2,a2,a1,LSL #29
  294.     ADDHS    a4,a4,a3,LSL #29
  295. |x$divide_b29|
  296.     CMP    a2,a1,LSL #28
  297.     SUBHS    a2,a2,a1,LSL #28
  298.     ADDHS    a4,a4,a3,LSL #28
  299. |x$divide_b28|
  300.     CMP    a2,a1,LSL #27
  301.     SUBHSS    a2,a2,a1,LSL #27
  302.     ADDHS    a4,a4,a3,LSL #27
  303. |x$divide_b27|
  304.     CMP    a2,a1,LSL #26
  305.     SUBHS    a2,a2,a1,LSL #26
  306.     ADDHS    a4,a4,a3,LSL #26
  307. |x$divide_b26|
  308.     CMP    a2,a1,LSL #25
  309.     SUBHS    a2,a2,a1,LSL #25
  310.     ADDHS    a4,a4,a3,LSL #25
  311. |x$divide_b25|
  312.     CMP    a2,a1,LSL #24
  313.     SUBHS    a2,a2,a1,LSL #24
  314.     ADDHS    a4,a4,a3,LSL #24
  315. |x$divide_b24|
  316.     CMP    a2,a1,LSL #23
  317.     SUBHS    a2,a2,a1,LSL #23
  318.     ADDHS    a4,a4,a3,LSL #23
  319. |x$divide_b23|
  320.     CMP    a2,a1,LSL #22
  321.     SUBHS    a2,a2,a1,LSL #22
  322.     ADDHS    a4,a4,a3,LSL #22
  323. |x$divide_b22|
  324.     CMP    a2,a1,LSL #21
  325.     SUBHS    a2,a2,a1,LSL #21
  326.     ADDHS    a4,a4,a3,LSL #21
  327. |x$divide_b21|
  328.     CMP    a2,a1,LSL #20
  329.     SUBHS    a2,a2,a1,LSL #20
  330.     ADDHS    a4,a4,a3,LSL #20
  331. |x$divide_b20|
  332.     CMP    a2,a1,LSL #19
  333.     SUBHS    a2,a2,a1,LSL #19
  334.     ADDHS    a4,a4,a3,LSL #19
  335. |x$divide_b19|
  336.     CMP    a2,a1,LSL #18
  337.     SUBHS    a2,a2,a1,LSL #18
  338.     ADDHS    a4,a4,a3,LSL #18
  339. |x$divide_b18|
  340.     CMP    a2,a1,LSL #17
  341.     SUBHS    a2,a2,a1,LSL #17
  342.     ADDHS    a4,a4,a3,LSL #17
  343. |x$divide_b17|
  344.     CMP    a2,a1,LSL #16
  345.     SUBHS    a2,a2,a1,LSL #16
  346.     ADDHS    a4,a4,a3,LSL #16
  347. |x$divide_b16|
  348.     CMP    a2,a1,LSL #15
  349.     SUBHS    a2,a2,a1,LSL #15
  350.     ADDHS    a4,a4,a3,LSL #15
  351. |x$divide_b15|
  352.     CMP    a2,a1,LSL #14
  353.     SUBHS    a2,a2,a1,LSL #14
  354.     ADDHS    a4,a4,a3,LSL #14
  355. |x$divide_b14|
  356.     CMP    a2,a1,LSL #13
  357.     SUBHS    a2,a2,a1,LSL #13
  358.     ADDHS    a4,a4,a3,LSL #13
  359. |x$divide_b13|
  360.     CMP    a2,a1,LSL #12
  361.     SUBHS    a2,a2,a1,LSL #12
  362.     ADDHS    a4,a4,a3,LSL #12
  363. |x$divide_b12|
  364.     CMP    a2,a1,LSL #11
  365.     SUBHS    a2,a2,a1,LSL #11
  366.     ADDHS    a4,a4,a3,LSL #11
  367. |x$divide_b11|
  368.     CMP    a2,a1,LSL #10
  369.     SUBHS    a2,a2,a1,LSL #10
  370.     ADDHS    a4,a4,a3,LSL #10
  371. |x$divide_b10|
  372.     CMP    a2,a1,LSL #9
  373.     SUBHS    a2,a2,a1,LSL #9
  374.     ADDHS    a4,a4,a3,LSL #9
  375. |x$divide_b9|
  376.     CMP    a2,a1,LSL #8
  377.     SUBHS    a2,a2,a1,LSL #8
  378.     ADDHS    a4,a4,a3,LSL #8
  379. |x$divide_b8|
  380.     CMP    a2,a1,LSL #7
  381.     SUBHS    a2,a2,a1,LSL #7
  382.     ADDHS    a4,a4,a3,LSL #7
  383. |x$divide_b7|
  384.     CMP    a2,a1,LSL #6
  385.     SUBHS    a2,a2,a1,LSL #6
  386.     ADDHS    a4,a4,a3,LSL #6
  387. |x$divide_b6|
  388.     CMP    a2,a1,LSL #5
  389.     SUBHS    a2,a2,a1,LSL #5
  390.     ADDHS    a4,a4,a3,LSL #5
  391. |x$divide_b5|
  392.     CMP    a2,a1,LSL #4
  393.     SUBHS    a2,a2,a1,LSL #4
  394.     ADDHS    a4,a4,a3,LSL #4
  395. |x$divide_b4|
  396.     CMP    a2,a1,LSL #3
  397.     SUBHS    a2,a2,a1,LSL #3
  398.     ADDHS    a4,a4,a3,LSL #3
  399. |x$divide_b3|
  400.     CMP    a2,a1,LSL #2
  401.     SUBHS    a2,a2,a1,LSL #2
  402.     ADDHS    a4,a4,a3,LSL #2
  403. |x$divide_b2|
  404.     CMP    a2,a1,LSL #1
  405.     SUBHS    a2,a2,a1,LSL #1
  406.     ADDHS    a4,a4,a3,LSL #1
  407. |x$divide_b1|
  408.     CMP    a2,a1
  409.     SUBHS    a2,a2,a1
  410.     ADDHS    a4,a4,a3
  411. |x$divide_b0|
  412.  
  413.     TST    ip,#&20000000
  414.     BNE    |x$udivide_l1|
  415.     MOV    a1,a4
  416.     CMP    ip,#0
  417.     RSBMI    a2,a2,#0
  418.     MOVS    ip,ip,LSL #1
  419.     RSBMI    a1,a1,#0
  420.     MOVS    pc,lr
  421.  
  422. |x$udivide_l1|
  423.     TST    ip,#&10000000
  424.     MOV    a2,a2,LSL #1
  425.     ORRNE    a2,a2,#1
  426.     MOV    a4,a4,LSL #1
  427.     CMP    a2,a1
  428.     SUBHS    a2,a2,a1
  429.     ADDHS    a4,a4,a3
  430.     MOV    a1,a4
  431.     MOVS    pc,lr
  432.  
  433.  
  434.     IMPORT    raise
  435.  
  436.     EXPORT    |x$stack_overflow|    ; allocate 512 bytes more stack
  437. |x$stack_overflow|
  438.     STMFD    sp!,{a1,a2,lr}
  439.     LDR    a1,[pc,#|__break_ptr|-.-8]
  440.     LDR    a1,[a1,#0]
  441.     LDR    lr,[pc,#|__stack_ptr|-.-8]
  442.     LDR    a2,[lr,#0]
  443.     SUB    a2,a2,#512
  444.     CMP    a2,a1
  445.     STR    a2,[lr,#0]
  446.     ADD    sl,a2,#256
  447.     LDMHIFD sp!,{a1,a2,pc}^
  448.     STMFD    sp!,{a3,a4,ip}
  449.     MOV    a1,#7    ; SIGEMT
  450.     BL    raise
  451.     LDMFD    sp!,{a3,a4,ip}
  452.     LDMFD    sp!,{a1,a2,pc}^
  453.  
  454.     EXPORT    |x$stack_overflow_1|    ; allocate stack to below <ip>
  455. |x$stack_overflow_1|
  456.     CMP    ip,sl            ; sanity check
  457.     MOVHIS    pc,lr
  458.     STMFD    sp!,{a1,a2,lr}
  459.     LDR    a1,[pc,#|__break_ptr|-.-8]
  460.     LDR    a1,[a1,#0]
  461.     LDR    lr,[pc,#|__stack_ptr|-.-8]
  462.     SUB    a2,ip,#256
  463.     CMP    a2,a1
  464.     STR    a2,[lr,#0]
  465.     ADD    sl,a2,#256
  466.     LDMHIFD sp!,{a1,a2,pc}^
  467.     STMFD    sp!,{a3,a4,ip}
  468.     MOV    a1,#7    ; SIGEMT
  469.     BL    raise
  470.     LDMFD    sp!,{a3,a4,ip}
  471.     LDMFD    sp!,{a1,a2,pc}^
  472.  
  473.  
  474.     EXPORT    |_wr1chk|
  475.     EXPORT    |_wr2chk|
  476.     EXPORT    |_wr4chk|
  477. |_wr1chk|
  478. |_wr2chk|
  479. |_wr4chk|
  480.     LDR    a2,[pc,#|__lomem_ptr|-.-8]
  481.     LDR    a2,[a2,#0]
  482.     B    |__rwNchk|
  483.  
  484.     EXPORT    |_rd1chk|
  485.     EXPORT    |_rd2chk|
  486.     EXPORT    |_rd4chk|
  487. |_rd1chk|
  488. |_rd2chk|
  489. |_rd4chk|
  490.     LDR    a2,[pc,#|__base_ptr|-.-8]
  491.     LDR    a2,[a2,#0]
  492. |__rwNchk|
  493.     CMP    a1,a2
  494.     BLO    |__rwNsegv|
  495.     LDR    a2,[pc,#|__break_ptr|-.-8]
  496.     LDR    a2,[a2,#0]
  497.     CMP    a1,a2
  498.     MOVLOS    pc,lr
  499.     LDR    a2,[pc,#|__stack_ptr|-.-8]
  500.     LDR    a2,[a2,#0]
  501.     CMP    a1,a2
  502.     BLO    |__rwNsegv|
  503.     LDR    a2,[pc,#|__himem_ptr|-.-8]
  504.     LDR    a2,[a2,#0]
  505.     CMP    a1,a2
  506.     MOVLOS    pc,lr
  507. |__rwNsegv|
  508.     MOV    a1,#11    ; SIGSEGV
  509.     B    raise
  510.  
  511.     EXPORT    |_count|
  512. |_count|
  513.     ADD    lr,lr,#8
  514.     MOVS    pc,lr
  515.  
  516.     EXPORT    |_count1|
  517. |_count1|
  518.     ADD    lr,lr,#8
  519.     MOVS    pc,lr
  520.  
  521.  
  522.     AREA    |C$$data|
  523.  
  524.     EXPORT    |__cli|     ; CLI from OS_GetEnv
  525. |__cli|
  526.     DCD    0
  527.  
  528.     EXPORT    |__base|    ; BASE (application = 0x8000)
  529. |__robase|
  530.     DCD    |Image$$RO$$Base|
  531. |__base|
  532.     DCD    0
  533.     EXPORT    |__lomem|    ; LOMEM
  534. |__rwlimit|
  535.     DCD    |Image$$RW$$Limit|
  536. |__lomem|
  537.     DCD    0
  538.     EXPORT    |__himem|    ; HIMEM from OS_GetEnv
  539. |__himem|
  540.     DCD    0
  541.  
  542.     EXPORT    |__break|    ; the 'break'
  543. |__break|
  544.     DCD    0
  545.     EXPORT    |__stack|    ; stack limit
  546. |__stack|
  547.     DCD    0
  548.  
  549.     EXPORT    |__time|    ; start time - 5 byte format
  550. |__time|
  551.     DCD    0        ; low word
  552.     DCD    0        ; high byte
  553.  
  554.  
  555.     AREA    |C$$wrcode|,CODE
  556.  
  557.     EXPORT    |__fptest|
  558. |__fptest|
  559.     LDR    a1,[pc,#|__fptest_l3|-.-8]
  560.     STR    a1,[pc,#|__fptest_l1|-.-8]
  561.     B    |__fptest_l1|    ; clear pipeline
  562. |__fptest_l1|
  563.     DCD    0
  564. |__fptest_l2|
  565.     MOVS    pc,lr
  566. |__fptest_l3|
  567.     MVFD    f0,f0
  568.  
  569.     EXPORT    |__fpclr|
  570. |__fpclr|
  571.     MOV    a1,#0
  572.     STR    a1,[pc,#|__fpflag|-.-8]
  573.     LDR    a1,[pc,#|__fptest_l2|-.-8]
  574.     STR    a1,[pc,#|__fptest_l1|-.-8]
  575.     MOVS    pc,lr
  576.  
  577.     EXPORT    |__fpflag|
  578. |__fpflag|
  579.     DCD    0
  580.  
  581.     END
  582.